package main

import (
	"fmt"
	"time"
)

// 传输错误结构体
// 自定义错误数据结构体
type transportError struct {
	From string
	To   string
	Msg  string
}

// 实现方法，等于实现了error接口
func (e *transportError) Error() string {
	return fmt.Sprintf("从【%s】到【%s】传输失败，原因: %s", e.From, e.To, e.Msg)
}

func throwError() {
	err := transportError{
		From: "192.168.1.1",
		To:   "172.30.1.1",
		Msg:  "远程连接失败",
	}
	panic(err)
}

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("%s\n", err)
		}
	}()

	//throwError()
	go func() {
		throwError()
	}()
	time.Sleep(1 * time.Second)
	//主协程中的异常捕获，捕获不到子协程中的异常。
	//因此defer延迟处理显得格外重要，不能忽视任何一个可能抛出异常的函数或者方法
	fmt.Println("主线程成功退出")
}
